import com.sun.org.apache.bcel.internal.generic.NEW;

import javax.tools.ForwardingFileObject;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Description： TODO
 * Author： 王多鱼
 * CreateTime： 2021/6/10 22:10
    题目：多线程之间按顺序调用，实现A-B-C三个线程启动，要求如下：
  AA打印5次，B打印10次，C打印15次
  紧接着
 A打印5次 B打印10次 c打印15次
 。。。。。。
 打印10轮
 **/
class ShareResource{
    private int number = 1;//A-1 B-2 C-3
    private Lock lock = new ReentrantLock();
    private Condition condition1 = lock.newCondition();
    private Condition condition2 = lock.newCondition();
    private Condition condition3 = lock.newCondition();

    public void print5(){
        lock.lock();
        try {
            //1 判断
            while (number !=1){
                condition1.await();
            }
            //2 干活
            for (int i = 1; i <=5 ; i++) {
                System.out.println(Thread.currentThread().getName()+"\t" +i);
            }
            //3 通知唤醒
            number=2;//修改标志位
            condition2.signal();//唤醒B线程
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }

    public void print10(){
        lock.lock();
        try {
            //1 判断
            while (number !=2){
                condition2.await();
            }
            //2 干活
            for (int i = 1; i <=10 ; i++) {
                System.out.println(Thread.currentThread().getName()+"\t" +i);
            }
            //3 通知唤醒
            number=3;//修改标志位
            condition3.signal();//唤醒C线程
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }

    public void print15(){
        lock.lock();
        try {
            //1 判断
            while (number !=3){
                condition3.await();
            }
            //2 干活
            for (int i = 1; i <=15 ; i++) {
                System.out.println(Thread.currentThread().getName()+"\t" +i);
            }
            //3 通知唤醒
            number=1;//修改标志位
            condition1.signal();//唤醒A线程
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }
}
public class SyncAndReentrantLockDemo {
    public static void main(String[] args) {
        ShareResource shareResource= new ShareResource();
        new Thread(()->{
            for (int i = 1; i <=10 ; i++) {
                shareResource.print5();
            }
        },"A").start();
        new Thread(()->{
            for (int i = 1; i <=10 ; i++) {
                shareResource.print10();
            }
        },"B").start();
        new Thread(()->{
            for (int i = 1; i <=10 ; i++) {
                shareResource.print15();
            }
        },"C").start();
    }
}
